package com.aaron.test.singleton;

import com.aaron.singleton.unlazy.UnLazySingleton;
import com.aaron.test.singleton.lazy.LazySingletonInn;

public class Singleton {
	
	public static void main(String[] args){
		
		//Lazy方式  静态内部类
//		LazySingletonInn s1 = LazySingletonInn.getInstance();
//		LazySingletonInn s2 = LazySingletonInn.getInstance();
//		System.out.println(s1 == s2);
		
		//UnLazy方式  final静态成员
		UnLazySingleton s1 = UnLazySingleton.getInstance();
		UnLazySingleton s2 = UnLazySingleton.getInstance();
		System.out.println(s1 == s2);	
		
		//构造函数改为public
		//这就是静态内部类和非Lazy方式的去别，以及为什么静态内部类是Lazy方式
		//按我的理解：类加载时，初始化静态成员，这里只会初始化直接包含的静态成员，静态内部类的静态成员需要在显式调用时初始化，且只初始化一次，
		//静态内部类在加载外部类时只是包含class描述
		//对于UnLazy方式，类加载初始化静态成员，调用构造函数，通过new创建实例对象时，再一次调用构造函数
//		LazySingletonInn s1 = new LazySingletonInn();
//		LazySingletonInn s7 = new LazySingletonInn();
//		LazySingletonInn s5 = s1.getInstance();
//		LazySingletonInn s6 = s7.getInstance();
//		LazySingletonInn s3 = LazySingletonInn.getInstance();
//		LazySingletonInn s4 = LazySingletonInn.getInstance();
//		UnLazySingleton s2  = new UnLazySingleton();
		
	}
	
}
